package com.zack.arithmetic.leetCode;

/**
 * 整数反转
 *
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * 示例 1:
 *
 * 输入: 123
 * 输出: 321
 *  示例 2:
 *
 * 输入: -123
 * 输出: -321
 * 示例 3:
 *
 * 输入: 120
 * 输出: 21
 * 注意:
 *
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2的31次方,  2的31次方 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
 *
 *
 * @ClassName IntegerReversal
 * @Description TODO
 * @Author zhifang
 * @Date 2020/3/23 下午2:28
 * @Version 1.0
 **/
public class IntegerReversal {

    public int reverse(int x) {
        boolean minus = (x < 0) ? true : false;
        String strX = String.valueOf(Math.abs(x));
        String[] strArray = strX.split("");
        StringBuffer sb = new StringBuffer();
        if(minus){
            sb.append("-");
        }
        for (int i = strArray.length; i > 0; i--){
            sb.append(strArray[i - 1]);
        }
        if(!minus){
            if(sb.toString().length() >= 10){
                String front = sb.toString().substring(0, 5);
                String behind = sb.toString().substring(5, sb.toString().length());
                if(Integer.valueOf(front) > 21474 || (Integer.valueOf(front) >= 21474 && Integer.valueOf(behind) > 83647)){
                    return 0;
                }
            }
        }else{
            if(sb.toString().length() >= 10){
                String front = sb.toString().substring(1, 6);
                String behind = sb.toString().substring(6, sb.toString().length());
                if(Integer.valueOf(front) > 21474 || (Integer.valueOf(front) >= 21474 && Integer.valueOf(behind) > 83648)){
                    return 0;
                }
            }
        }
        return Integer.valueOf(sb.toString());
    }

    public int reverse1(int x) {
        long res = 0;
        int flag = -1;
        if(x < 0) x = -x;
        else flag = 1;
        while(x != 0){
            res = res * 10 + x % 10;
            x /= 10;
        }
        res *= flag;
        if(res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) return 0;
        else return (int)res;
    }

    public int reverse3(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }

    public static void main(String[] args) {
        IntegerReversal integerReversal = new IntegerReversal();
//        int result = integerReversal.reverse(-1563847412);
//        System.out.println(result);

        int result1 = integerReversal.reverse1(-54354);
        System.out.println(result1);
    }

}
